package com.myaihui.service;

import com.myaihui.domain.Resource;
import com.myaihui.domain.Role;
import com.myaihui.domain.SysUser;
import org.hibernate.SQLQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

/**
 * Created by sun on 2018/7/4.
 *
 * @author sunfuchang03@126.com
 * @version 1.0
 * @since 1.0
 */
@Component
public class CustomSysUserRepository {
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Static fields/constants/initializer
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Instance fields
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Constructors
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */



    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Public Methods
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    public SysUser findWithRolesAndResourcesByUsername(String username) {
        Assert.notNull(username, "Username must noe be empty.");
        // 有问题
        String sql = "select  {u.*}, " +
                "r.id {role.id}, " +
                "r.code {role.code}, " +
                "r.name {role.name}, " +
                "r.description {role.description}, " +
                "r.available {role.available}, " +
                "re.id {resource.id}, " +
                "re.code {resource.code}, " +
                "re.name {resource.name}, " +
                "re.type {resource.type}, " +
                "re.url {resource.url}, " +
                "re.description {resource.description}, " +
                "re.available {resource.available}, " +
                "re.platformId {resource.platformId}, " +
                "re.parentId {resource.platformId} " +
                "from sys_user u " +
                "left join sys_user_role ur on u.id = ur.userId " +
                "left join sys_role r on ur.roleId = r.id " +
                "left join sys_role_resource rr on r.id = rr.roleId " +
                "left join sys_resource re on re.id = rr.resourceId " +
                "where u.username = ?";
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Query query = entityManager.createNativeQuery(sql);
        query.setParameter(1, username);

        SQLQuery sqlQuery = query.unwrap(SQLQuery.class)
                .addEntity("u", SysUser.class)
                .addEntity("role", Role.class)
                .addEntity("resource", Resource.class);
//        sqlQuery.setResultTransformer(
//                Transformers.aliasToBean(SysUser.class)
//        );
        SysUser sysUser = (SysUser) sqlQuery.uniqueResult();
        entityManager.close();
        return sysUser;
    }
    
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     *
     * Private Methods
     *
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */


}